listitemfactory: Sanitize APIs
authorBenjamin Otte <otte@redhat.com>
Sun, 9 Jun 2019 20:50:46 +0000 (22:50 +0200)
committerMatthias Clasen <mclasen@redhat.com>
Sat, 30 May 2020 23:26:45 +0000 (19:26 -0400)
Make sure the APIs follow a predictable path:

setup
  bind
    rebind/update (0-N times)
  unbind
teardown

This is the first step towards providing multiple different factories.

gtk/gtklistitemfactory.c
gtk/gtklistitemfactoryprivate.h
gtk/gtklistitemmanager.c

index 012ed3b123d3bad83e07e8d4336f8bab6f7d4e90..510c04889baef92b2e096f11eb7d1b2cce835195 100644 (file)
  * Reusing factories across different views is allowed, but very uncommon.
  */
 
-struct _GtkListItemFactory
-{
-  GObject parent_instance;
-
-  GtkListItemSetupFunc setup_func;
-  GtkListItemBindFunc bind_func;
-  gpointer user_data;
-  GDestroyNotify user_destroy;
-};
-
-struct _GtkListItemFactoryClass
-{
-  GObjectClass parent_class;
-};
-
 G_DEFINE_TYPE (GtkListItemFactory, gtk_list_item_factory, G_TYPE_OBJECT)
 
 static void
@@ -135,7 +120,7 @@ gtk_list_item_factory_new (GtkListItemSetupFunc setup_func,
 
 void
 gtk_list_item_factory_setup (GtkListItemFactory *self,
-                             GtkListItem         *list_item)
+                             GtkListItem        *list_item)
 {
   g_return_if_fail (GTK_IS_LIST_ITEM_FACTORY (self));
 
@@ -165,6 +150,28 @@ gtk_list_item_factory_bind (GtkListItemFactory *self,
   g_object_thaw_notify (G_OBJECT (list_item));
 }
 
+void
+gtk_list_item_factory_rebind (GtkListItemFactory *self,
+                              GtkListItem        *list_item,
+                              guint               position,
+                              gpointer            item,
+                              gboolean            selected)
+{
+  g_return_if_fail (GTK_IS_LIST_ITEM_FACTORY (self));
+  g_return_if_fail (GTK_IS_LIST_ITEM (list_item));
+
+  g_object_freeze_notify (G_OBJECT (list_item));
+
+  gtk_list_item_set_item (list_item, item);
+  gtk_list_item_set_position (list_item, position);
+  gtk_list_item_set_selected (list_item, selected);
+
+  if (self->bind_func)  
+    self->bind_func (list_item, self->user_data);
+
+  g_object_thaw_notify (G_OBJECT (list_item));
+}
+
 void
 gtk_list_item_factory_update (GtkListItemFactory *self,
                               GtkListItem        *list_item,
@@ -197,3 +204,15 @@ gtk_list_item_factory_unbind (GtkListItemFactory *self,
 
   g_object_thaw_notify (G_OBJECT (list_item));
 }
+
+void
+gtk_list_item_factory_teardown (GtkListItemFactory *self,
+                                GtkListItem        *list_item)
+{
+  g_return_if_fail (GTK_IS_LIST_ITEM_FACTORY (self));
+
+  gtk_list_item_set_child (list_item, NULL);
+
+  gtk_list_item_set_selectable (list_item, TRUE);
+}
+
index dc538f09fadd8ed4294b79ee493cb220e22d8d33..34582257bc9101399be96e303c6ebff621b08148 100644 (file)
@@ -36,6 +36,21 @@ G_BEGIN_DECLS
 typedef struct _GtkListItemFactory GtkListItemFactory;
 typedef struct _GtkListItemFactoryClass GtkListItemFactoryClass;
 
+struct _GtkListItemFactory
+{
+  GObject parent_instance;
+
+  GtkListItemSetupFunc setup_func;
+  GtkListItemBindFunc bind_func;
+  gpointer user_data;
+  GDestroyNotify user_destroy;
+};
+
+struct _GtkListItemFactoryClass
+{
+  GObjectClass parent_class;
+};
+
 GType                   gtk_list_item_factory_get_type          (void) G_GNUC_CONST;
 
 GtkListItemFactory *    gtk_list_item_factory_new               (GtkListItemSetupFunc    setup_func,
@@ -45,12 +60,19 @@ GtkListItemFactory *    gtk_list_item_factory_new               (GtkListItemSetu
 
 void                    gtk_list_item_factory_setup             (GtkListItemFactory     *self,
                                                                  GtkListItem            *list_item);
+void                    gtk_list_item_factory_teardown          (GtkListItemFactory     *self,
+                                                                 GtkListItem            *list_item);
 
 void                    gtk_list_item_factory_bind              (GtkListItemFactory     *self,
                                                                  GtkListItem            *list_item,
                                                                  guint                   position,
                                                                  gpointer                item,
                                                                  gboolean                selected);
+void                    gtk_list_item_factory_rebind            (GtkListItemFactory     *self,
+                                                                 GtkListItem            *list_item,
+                                                                 guint                   position,
+                                                                 gpointer                item,
+                                                                 gboolean                selected);
 void                    gtk_list_item_factory_update            (GtkListItemFactory     *self,
                                                                  GtkListItem            *list_item,
                                                                  guint                   position,
index 35a894ed51f3c0477474c583deadc454107cd717..fde93c9708c5de94015496e00f90aa47fa9a4935 100644 (file)
@@ -1007,7 +1007,7 @@ gtk_list_item_manager_move_list_item (GtkListItemManager     *self,
 
   item = g_list_model_get_item (G_LIST_MODEL (self->model), position);
   selected = gtk_selection_model_is_selected (self->model, position);
-  gtk_list_item_factory_bind (self->factory, GTK_LIST_ITEM (list_item), position, item, selected);
+  gtk_list_item_factory_rebind (self->factory, GTK_LIST_ITEM (list_item), position, item, selected);
   gtk_widget_insert_after (list_item, _gtk_widget_get_parent (list_item), prev_sibling);
   g_object_unref (item);
 }
@@ -1063,6 +1063,7 @@ gtk_list_item_manager_release_list_item (GtkListItemManager *self,
     }
 
   gtk_list_item_factory_unbind (self->factory, GTK_LIST_ITEM (item));
+  gtk_list_item_factory_teardown (self->factory, GTK_LIST_ITEM (item));
   gtk_widget_unparent (item);
 }